/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidor;

import conUDP.SocketUDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author douglas
 */
public class ThreadAtualizaOnline extends Thread {

    private ArrayList<User> usuarios_online;
    private SocketUDP socket;
    private DatagramPacket pacote_envia, pacote_recebe;
    private boolean atualiza;
    private int numMaxTentativas=11;
    private ServidorUDP servidor;

    public ThreadAtualizaOnline(ArrayList<User> usuarios_online, boolean atualiza, ServidorUDP servidor) {
        this.usuarios_online = usuarios_online;
        this.atualiza = atualiza;
        this.servidor = servidor;
        try {
            socket = new SocketUDP(33333);
        } catch (SocketException ex) {
            Logger.getLogger(ThreadAtualizaOnline.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        byte[] buffer = "ON?".getBytes();
        byte[] sinal = new byte[2];//recebe "ON"
        boolean recebeuConfirmacao = false;

        while (true) {
            //System.out.println("IP E PORTA DA THREAD DO SERVER"+socket.getLocalAddress().toString()+":"+socket.getLocalPort());
            if (usuarios_online.size() > 0) {
                //System.out.println("TEM GENTE");
                //System.out.println("GENTE ONLINE "+usuarios_online.size());
                for (int k = 0; k < usuarios_online.size(); k++) {
                    //try {
                    recebeuConfirmacao = false;
                        for(int e = 0; e<2; e++)
                            sinal[e] = 0;
                        pacote_envia = new DatagramPacket(buffer, buffer.length, usuarios_online.get(k).getIp(), 55555);
                        pacote_recebe = new DatagramPacket(sinal, sinal.length);
                        
                        for (int i = 0; i < numMaxTentativas && !recebeuConfirmacao; i++) {
                           // System.out.println("vai");
                        recebeuConfirmacao = socket.envia(pacote_envia, pacote_recebe);
                           // System.out.println("QTD DE VOLTAS "+i);
                        }
                        //System.out.println("RECEBEU CONFIRMAÇÃO "+recebeuConfirmacao);
                        
                     /*   //atualiza = true;
                        //notifyAll();
                    } catch (SocketTimeoutException  ex) {
                        System.out.println("CABOU TEMPO");
                        recebeuConfirmacao = false;
                    } catch (InterruptedException ex) {
                        Logger.getLogger(ThreadAtualizaOnline.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(ThreadAtualizaOnline.class.getName()).log(Level.SEVERE, null, ex);
                    } finally {*/
                        if (recebeuConfirmacao == false) {
                            User del = usuarios_online.remove(k);
                            del.setOnline(false);
                            System.out.println(usuarios_online.size());
                        }
                    //}
                }
            }

            if (usuarios_online.size() > 0){ //precisa testar de novo posi pode entrar no primeiro if
                byte[] lista_online = new byte[1024]; //mas depois pode n ter mais ninguem on então a lista estaria vazia
                String s = Integer.toString(usuarios_online.size()).concat(":");

                for (int i = 0; i < usuarios_online.size(); i++) {
                    s = s.concat(usuarios_online.get(i).getLogin().concat(":"));
                }

                lista_online = s.getBytes();
                //System.out.println(s.split(":")[0]);

                for (int i = 0; i < usuarios_online.size(); i++) {
                    pacote_envia = new DatagramPacket(lista_online, lista_online.length,
                            usuarios_online.get(i).getIp(), 44444);
                    try {
                        socket.send(pacote_envia);
                        
                   // } catch (InterruptedException ex) {
                     //   Logger.getLogger(ThreadEnviaOnline.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(ThreadAtualizaOnline.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            try {
                this.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(ThreadAtualizaOnline.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
